package top.goldenyear.porpoise.framework.isolate.core.interceptor;

import top.goldenyear.porpoise.framework.common.model.LoginUser;
import top.goldenyear.porpoise.framework.security.core.util.UserContext;
import top.goldenyear.porpoise.framework.isolate.core.annotation.DataScope;
import lombok.extern.slf4j.Slf4j;
import cn.hutool.v7.core.util.ObjUtil;
import org.noear.solon.core.aspect.Interceptor;
import org.noear.solon.core.aspect.Invocation;

/**
 * 数据过滤处理
 *
 * @author warm
 */
@Slf4j
public class DataScopeInterceptor implements Interceptor {
  /** 全部数据权限 */
  public static final String DATA_SCOPE_ALL = "1";

  /** 自定数据权限 */
  public static final String DATA_SCOPE_CUSTOM = "2";

  /** 部门数据权限 */
  public static final String DATA_SCOPE_DEPT = "3";

  /** 部门及以下数据权限 */
  public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";

  /** 仅本人数据权限 */
  public static final String DATA_SCOPE_SELF = "5";

  /** 数据权限过滤关键字 */
  public static final String DATA_SCOPE = "dataScope";

  //    /**
  //     * 数据范围过滤
  //     *
  //     * @param inv       切点
  //     * @param user      用户
  //     * @param deptAlias 部门别名
  //     * @param userAlias 用户别名
  //     */
  //    public static void dataScopeFilter(Invocation inv, SysUser user, String deptAlias, String
  // userAlias) {
  //        StringBuilder sqlString = new StringBuilder();
  //        List<String> conditions = new ArrayList<>();
  //
  //        for (SysRole role : user.getRoles()) {
  //            String dataScope = role.getDataScope();
  //            if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) {
  //                continue;
  //            }
  //            if (DATA_SCOPE_ALL.equals(dataScope)) {
  //                sqlString = new StringBuilder();
  //                conditions.add(dataScope);
  //                break;
  //            } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) {
  //                sqlString.append(StringUtils.format(
  //                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id =
  // {} ) ", deptAlias,
  //                        role.getRoleId()));
  //            } else if (DATA_SCOPE_DEPT.equals(dataScope)) {
  //                sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias,
  // user.getDeptId()));
  //            } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) {
  //                sqlString.append(StringUtils.format(
  //                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or
  // find_in_set( {} , ancestors ) )",
  //                        deptAlias, user.getDeptId(), user.getDeptId()));
  //            } else if (DATA_SCOPE_SELF.equals(dataScope)) {
  //                if (StringUtils.isNotBlank(userAlias)) {
  //                    sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias,
  // user.getUserId()));
  //                } else {
  //                    // 数据权限为仅本人且没有userAlias别名不查询任何数据
  //                    sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
  //                }
  //            }
  //            conditions.add(dataScope);
  //        }
  //
  //        // 多角色情况下，所有角色都不包含传递过来的权限字符，这个时候sqlString也会为空，所以要限制一下,不查询任何数据
  //        if (CollUtil.isEmpty(conditions)) {
  //            sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
  //        }
  //
  //        if (StringUtils.isNotBlank(sqlString.toString())) {
  //            Object params = inv.args()[0];
  //            if (ObjectUtil.isNotNull(params) && params instanceof BaseEntity baseEntity) {
  //                baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
  //            }
  //        }
  //    }

  @Override
  public Object doIntercept(Invocation inv) throws Throwable {
    clearDataScope(inv);
    handleDataScope(inv);
    return inv.invoke();
  }

  protected void handleDataScope(final Invocation inv) {
    DataScope anno = inv.method().getAnnotation(DataScope.class);
    // 获取当前的用户
    LoginUser loginUser = UserContext.getLoginUser();
    if (ObjUtil.isNotNull(loginUser)) {
      //            SysUser currentUser = loginUser.getUser();
      //            // 如果是超级管理员，则不过滤数据
      //            if (!LoginHelper.isSuperAdmin()) {
      //                dataScopeFilter(inv, currentUser, anno.deptAlias(),
      //                        anno.userAlias());
      //            }
    }
  }

  /** 拼接权限sql前先清空params.dataScope参数防止注入 */
  private void clearDataScope(final Invocation inv) {
    Object params = inv.args()[0];
    //        if (ObjectUtil.isNotNull(params) && params instanceof BaseEntity baseEntity) {
    //            baseEntity.getParams().put(DATA_SCOPE, "");
    //        }
  }
}
